S2. Descriptive analyses

Location of studies

ES distribution

Description

world_SIMBA$continent = c("Oceania", "Asia", "America", "America", "Asia", "Europe", "Africa", "Europe", "Europe", "Europe", "Europe", "Europe", "Oceania", "Europe", "Europe", "Europe", "Africa", "Europe", "America")
continent = world_SIMBA %>%
  group_by(continent) %>%
  summarise(n_studies = sum(n_studies)) 

paste0(
  "Among them, we were able to access the data of ",
  length(unique(dat_main$ID)),
  " unique studies, and we were able to collect raw data from ",
  sum(dat_main[!duplicated(dat_main$ID),]$raw_data=="YES"),
  " studies Out of the ",
  length(unique(dat_main$ID)),
  " studies, ",
  continent[continent$continent=="America", ]$n_studies,
  " were conducted in America (",
  "among which ",
  world_SIMBA[world_SIMBA$COUNTRY=="USA",]$n_studies,
  " were conducted in the USA), ",
  continent[continent$continent=="Europe", ]$n_studies,
  " in Europe, ",
  continent[continent$continent=="Oceania", ]$n_studies,
  " in Africa, ",
  continent[continent$continent=="Asia", ]$n_studies,
  " in Asia, and ",
  continent[continent$continent=="Africa", ]$n_studies,
  " in Oceania. The number of participants per study ranged from ",
  min(as.numeric(dat_main$N)),
  " to ",
  max(as.numeric(dat_main$N)),
  ". The mean length of follow up ranged from ",
  min(as.numeric(dat_main$followupduration)),
  " years to ",
  round(max(as.numeric(dat_main$followupduration))),
  " years. Among the ", 
    sum(dat_main[!duplicated(dat_main$ID),]$Cut_off_date=="Official"),
  " studies included in our main analyses, ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Diagnosis", na.rm=TRUE),
  " studies categorized ADHD using a formal diagnostic procedure, ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Symptoms", na.rm=TRUE),
" based on symptoms count, and ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Broad-based-scale", na.rm=TRUE),
  " based on the results of broad-based scales (such as the CBCL or SDQ)."
)
## [1] "Among them, we were able to access the data of 57 unique studies, and we were able to collect raw data from 34 studies Out of the 57 studies, 25 were conducted in America (among which 22 were conducted in the USA), 22 in Europe, 5 in Africa, 3 in Asia, and 2 in Oceania. The number of participants per study ranged from 10 to 813. The mean length of follow up ranged from 4 years to 33 years. Among the 42 studies included in our main analyses, 28 studies categorized ADHD using a formal diagnostic procedure, 17 based on symptoms count, and 12 based on the results of broad-based scales (such as the CBCL or SDQ)."

S3. Primary analysis

Main model

res_prim <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
res_prim
## Number of studies combined: n = 42
## Number of estimates combined: k = 44
## Number of observations: o = 4648
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0242 [0.9896; 1.0600] 1.36  0.1733
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0043 [0.0000; 0.0119]; tau.1 = 0.0656 [0.0000; 0.1092] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0078]; tau.2 < 0.0001 [0.0000; 0.0881] (within cluster)
##  I^2 = 43.4% [19.0%; 60.5%]; H = 1.33 [1.11; 1.59]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  76.01   43  0.0014
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau
# as per protocol
dat_prim = subset(dat_main, Cut.off.source == "Official")
res <- metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
res

predict(res, transf=exp)

W <- diag(1/res$vi)
X <- model.matrix(res)
P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
100 * sum(res$sigma2) / (sum(res$sigma2) + (res$k-res$p)/sum(diag(P)))

Forest plot

meta::forest(res_prim,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

Equivalence tests

tost = metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim, level = 90)
## [1] "Because our analyses did not reveal a statistically significant effect of relative age on the persistence of ADHD, we performed equivalence tests to explore the smallest effect size that the data allow to reject. Equivalence tests show that even if relative age leads to a decrease in the persistence of ADHD, this effect is extremely small OR=0.995"

S4. RAE baseline

Relative age effect at baseline

colnames(df.base.mob)[1:4] = paste0(colnames(df.base.mob)[1:4], "_base")
df.base.mob[,1:4] <- lapply(df.base.mob[,1:4], function(x) as.numeric(as.character(x)))

dat_baseline = dplyr::left_join(df.base.mob, dat_main[,c("Study", "study_ID", "Study_name", "Cut_off_date", "logOR", "seOR", "pOR", "N")]) %>%
  filter(Cut_off_date == "Official" & N_base > 1000)
## Joining, by = "Study"
res_mob_baseline <- meta::metagen(TE = logOR_base,
                        seTE = seOR_base,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_baseline$N_base),
                        sm = "OR",
                        studlab = paste(dat_baseline$Study_name),
                        data = dat_baseline)
res_mob_baseline
## Number of studies combined: n = 9
## Number of estimates combined: k = 10
## Number of observations: o = 99149
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0374 [1.0179; 1.0573] 3.78  0.0002
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0002 [0.0000; 0.0027]; tau.1 = 0.0140 [0.0000; 0.0523] (between cluster)
##  tau^2.2 = 0.0003 [0.0000; 0.0026]; tau.2 = 0.0180 [0.0000; 0.0509] (within cluster)
##  I^2 = 58.0% [15.4%; 79.2%]; H = 1.54 [1.09; 2.19]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  21.45    9  0.0108
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_mob_baseline,
             smlab = "Association of MoB with \n childhood ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

S5. Sensitivity/moderation analyses

1. RAE cohorts

Main model

# dat_rae_cohorts_p = dat_main[which(dat_main$Study_name %in%
#                                    dat_baseline[dat_baseline$pOR < .05,]$Study_name), ]
dat_rae_cohorts_p = subset(dat_baseline, pOR_base < 0.05)

res_rae_cohorts_p <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_rae_cohorts_p$N),
                        sm = "OR",
                        studlab = paste(dat_rae_cohorts_p$Study_name),
                        data = dat_rae_cohorts_p)
res_rae_cohorts_p
## Number of studies combined: k = 6
## Number of observations: o = 2129
## 
##                          OR           95%-CI    z p-value
## Common effect model  1.0174 [0.9891; 1.0465] 1.20  0.2312
## Random effects model 1.0174 [0.9891; 1.0465] 1.20  0.2312
## 
## Quantifying heterogeneity:
##  tau^2 = 0 [0.0000; 0.0347]; tau = 0 [0.0000; 0.1862]
##  I^2 = 0.0% [0.0%; 74.6%]; H = 1.00 [1.00; 1.99]
## 
## Test of heterogeneity:
##     Q d.f. p-value
##  4.06    5  0.5404
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau
# dat_baseline$es_id = 1:nrow(dat_baseline)
# res_mod_i <- metafor::rma.mv(logOR ~ sig_p-1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_baseline)
# res_mod_i

Forest plot

meta::forest(res_rae_cohorts_p,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

2. Truncated MoB

Main model

# colnames(dat_trunc)[1:4] = paste0(colnames(dat_trunc)[1:4],
#                                   "_trunc")
dat_trunc_meta = dplyr::left_join(dat_prim[,c("Study", "Name")], dat_trunc, by="Study")
dat_trunc_meta$Analysis = "Truncated MoB"
# dat_trunc_meta[which(is.na(dat_trunc_meta$logOR)), "Name"]
df_trunc = rbind(dat_trunc_meta, dat_prim[,c(colnames(dat_trunc_meta))]) %>%
  filter(!Name %in% dat_trunc_meta[which(is.na(dat_trunc_meta$logOR)), "Name"])
df_trunc[3:4] <- apply(df_trunc[3:4], 2, as.numeric)

V.SCE  <- with(df_trunc,
  clubSandwich::impute_covariance_matrix(
    vi = seOR^2, 
    cluster = Study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = Analysis))
## Registered S3 method overwritten by 'clubSandwich':
##   method    from    
##   bread.mlm sandwich
res_trunc <- metafor::rma.mv(yi= logOR, V = V.SCE,
                       data = df_trunc, 
                       mods = ~ Analysis - 1,
                       random = ~ Analysis | Study,
                       struct = "DIAG",
                       sparse = TRUE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
metafor::profile.rma.mv(res_trunc)
## Profiling tau2 = 1

## Profiling tau2 = 2

predict(res_trunc, transf=exp)
## 
##      pred  ci.lb  ci.ub  pi.lb  pi.ub    tau2.level 
## 1  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 2  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 3  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 4  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 5  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 6  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 7  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 8  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 9  1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 10 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 11 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 12 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 13 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 14 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 15 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 16 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 17 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 18 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 19 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 20 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 21 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 22 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 23 1.0049 0.9616 1.0503 0.9616 1.0503 Truncated MoB 
## 24 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 25 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 26 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 27 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 28 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 29 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 30 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 31 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 32 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 33 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 34 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 35 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 36 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 37 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 38 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 39 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 40 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 41 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 42 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 43 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 44 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 45 1.0482 1.0030 1.0955 1.0030 1.0955       Primary 
## 46 1.0482 1.0030 1.0955 1.0030 1.0955       Primary

Forest plot

meta::forest(res_rae_cohorts_p,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

2. Follow-up > 10yo

Main model

dat_S2 <- data.frame(subset(df.clean, grepl("S1:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S2 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S2$N),
                        sm = "OR",
                        studlab = paste(dat_S2$Study_name),
                        data = dat_S2)
res_S2
## Number of studies combined: n = 13
## Number of estimates combined: k = 14
## Number of observations: o = 998
## 
##                          OR           95%-CI     z p-value
## Random effects model 0.9845 [0.9168; 1.0572] -0.43  0.6676
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0074 [0.0000; 0.0318]; tau.1 = 0.0861 [0.0000; 0.1784] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0280]; tau.2 < 0.0001 [0.0000; 0.1675] (within cluster)
##  I^2 = 41.8% [0.0%; 69.0%]; H = 1.31 [1.00; 1.80]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  22.34   13  0.0503
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S2,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

3. Age <=8 baseline & >=16 follow up

Main model

dat_S3 <- data.frame(subset(df.clean, grepl("S2:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S3 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S3$N),
                        sm = "OR",
                        studlab = paste(dat_S3$Study_name),
                        data = dat_S3)
res_S3
## Number of studies combined: n = 13
## Number of estimates combined: k = 14
## Number of observations: o = 855
## 
##                          OR           95%-CI     z p-value
## Random effects model 0.9733 [0.8934; 1.0603] -0.62  0.5355
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0118 [0.0000; 0.0522]; tau.1 = 0.1086 [0.0000; 0.2285] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0429]; tau.2 < 0.0001 [0.0000; 0.2070] (within cluster)
##  I^2 = 50.1% [7.7%; 73.0%]; H = 1.42 [1.04; 1.92]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  26.04   13  0.0168
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S3,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

4. Same ADHD tool baseline & follow up

Main model

dat_S4 <- data.frame(subset(df.clean, grepl("S3:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S4 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S4$N),
                        sm = "OR",
                        studlab = paste(dat_S4$Study_name),
                        data = dat_S4)
res_S4
## Number of studies combined: n = 26
## Number of estimates combined: k = 29
## Number of observations: o = 3809
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0385 [0.9992; 1.0794] 1.92  0.0550
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0035 [0.0000; 0.0113]; tau.1 = 0.0595 [0.0000; 0.1063] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0067]; tau.2 < 0.0001 [0.0000; 0.0820] (within cluster)
##  I^2 = 41.6% [9.0%; 62.5%]; H = 1.31 [1.05; 1.63]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  47.93   28  0.0109
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S4,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

5. Robust regression

Main model

dat_S5_cor <- data.frame(subset(df.clean, grepl("S6:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

dat_S5_uncor <- subset(df.clean, grepl("Primary", df.clean$Analysis, fixed = TRUE) & !Study %in% dat_S5_cor$Study)
dat_S5 = dplyr::bind_rows(dat_S5_cor, dat_S5_uncor)
## New names:
## * SamplingType...30 -> SamplingType...115
## * Attrition...31 -> Attrition...116
## * RoB_1_Representativeness...32 -> RoB_1_Representativeness...117
## * RoB_2_Assessment.of.outcome.at.baseline...33 -> RoB_2_Assessment.of.outcome.at.baseline...118
## * RoB_3_Assessment.of.outcome.at.follow.up...34 -> RoB_3_Assessment.of.outcome.at.follow.up...119
## * ...
## New names:
## * SamplingType...30 -> SamplingType...115
## * Attrition...31 -> Attrition...116
## * RoB_1_Representativeness...32 -> RoB_1_Representativeness...117
## * RoB_2_Assessment.of.outcome.at.baseline...33 -> RoB_2_Assessment.of.outcome.at.baseline...118
## * RoB_3_Assessment.of.outcome.at.follow.up...34 -> RoB_3_Assessment.of.outcome.at.follow.up...119
## * ...
res_S5 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S5$N),
                        sm = "OR",
                        studlab = paste(dat_S5$Study_name),
                        data = dat_S5)
res_S5
## Number of studies combined: n = 57
## Number of estimates combined: k = 61
## Number of observations: o = 6340
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0130 [0.9852; 1.0416] 0.91  0.3636
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0034 [0.0000; 0.0086]; tau.1 = 0.0587 [0.0000; 0.0926] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0065]; tau.2 < 0.0001 [0.0000; 0.0804] (within cluster)
##  I^2 = 35.3% [11.4%; 52.8%]; H = 1.24 [1.06; 1.46]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  92.76   60  0.0042
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S5,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

6. ADHD subtypes

Main model

dat_S6 <- data.frame(subset(df.clean, grepl("S8:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID) %>%
  filter(Cut_off_date == "Official")

res_S6 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        subgroup = Analysis,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S6$N),
                        sm = "OR",
                        studlab = paste(dat_S6$Study_name),
                        data = dat_S6)
res_S6
## Number of studies combined: n = 19
## Number of estimates combined: k = 31
## Number of observations: o = 952
## 
##                          OR           95%-CI     z p-value
## Random effects model 0.9952 [0.9495; 1.0431] -0.20  0.8404
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0119]; tau.1 < 0.0001 [0.0000; 0.1089] (between cluster)
##  tau^2.2 = 0.0023 [0.0000; 0.0128]; tau.2 = 0.0475 [0.0000; 0.1130] (within cluster)
##  I^2 = 3.1% [0.0%; 42.1%]; H = 1.02 [1.00; 1.31]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  30.95   30  0.4176
## 
## Results for subgroups (random effects model):
##                                           k     OR           95%-CI  tau^2
## Analysis = S8: Combined presentation     18 1.0006 [0.9387; 1.0666] 0.0057
## Analysis = S8: Hyperactive presentation   6 0.9937 [0.8673; 1.1385]      0
## Analysis = S8: Inattentive presentation   7 0.9819 [0.8869; 1.0872]      0
##                                            tau     Q   I^2
## Analysis = S8: Combined presentation    0.0756 26.32 35.4%
## Analysis = S8: Hyperactive presentation      0  3.36  0.0%
## Analysis = S8: Inattentive presentation      0  1.20  0.0%
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S6,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

7. Above vs. below IQ median

Main model

dat_S7 <- data.frame(subset(df.clean, grepl("S9:", df.clean$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID) %>%
  filter(Cut_off_date == "Official")

res_S7 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        subgroup = Analysis,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S7$N),
                        sm = "OR",
                        studlab = paste(dat_S7$Study_name),
                        data = dat_S7)
res_S7
## Number of studies combined: n = 22
## Number of estimates combined: k = 36
## Number of observations: o = 1151
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0179 [0.9740; 1.0638] 0.79  0.4310
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0002 [0.0000; 0.0121]; tau.1 = 0.0146 [0.0000; 0.1101] (between cluster)
##  tau^2.2 = 0.0024 [0.0000; 0.0148]; tau.2 = 0.0489 [0.0000; 0.1218] (within cluster)
##  I^2 = 16.8% [0.0%; 45.1%]; H = 1.10 [1.00; 1.35]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  42.07   35  0.1916
## 
## Results for subgroups (random effects model):
##                                  k     OR           95%-CI  tau^2    tau     Q
## Analysis = S9: IQ above median  15 1.0183 [0.9427; 1.0999] 0.0071 0.0845 20.64
## Analysis = S9: IQ below median  21 1.0155 [0.9633; 1.0705]      0      0 21.37
##                                  I^2
## Analysis = S9: IQ above median 32.2%
## Analysis = S9: IQ below median  6.4%
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S7,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

8. Cook’s distance

Main model

res <- metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
x <- cooks.distance(res)
plot(x, type="o", pch=19, xlab="Observed Outcome", ylab="Cook's Distance")

influential <- unique(dat_prim$Study_name)[which(x > (3 * mean(x))) ]

dat_S8 <- dat_prim %>%
  filter(!Study_name %in% influential)

res_S8 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S8$N),
                        sm = "OR",
                        studlab = paste(dat_S8$Study_name),
                        data = dat_S8)
res_S8
## Number of studies combined: n = 40
## Number of estimates combined: k = 42
## Number of observations: o = 4525
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0142 [0.9944; 1.0344] 1.40  0.1613
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0030]; tau.1 < 0.0001 [0.0000; 0.0552] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0019]; tau.2 < 0.0001 [0.0000; 0.0437] (within cluster)
##  I^2 = 10.6% [0.0%; 38.9%]; H = 1.06 [1.00; 1.28]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  45.84   41  0.2785
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S8,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

10. ADHD diagnosis tool

Model

dat_S9 = dat_prim
dat_S9$diag.procedure[is.na(dat_S9$diag.procedure)] <- "Symptoms"
res_diag <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        subgroup = diag.procedure,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S9$N),
                        sm = "OR",
                        studlab = paste(dat_S9$Study_name),
                        data = dat_S9)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
res_diag
## Number of studies combined: n = 42
## Number of estimates combined: k = 44
## Number of observations: o = 4648
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0242 [0.9896; 1.0600] 1.36  0.1733
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0043 [0.0000; 0.0119]; tau.1 = 0.0656 [0.0000; 0.1092] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0078]; tau.2 < 0.0001 [0.0000; 0.0881] (within cluster)
##  I^2 = 43.4% [19.0%; 60.5%]; H = 1.33 [1.11; 1.59]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  76.01   43  0.0014
## 
## Results for subgroups (random effects model):
##                                      k     OR           95%-CI   tau^2     tau
## diag.procedure = Diagnosis          19 1.0412 [1.0009; 1.0832] <0.0001  0.0003
## diag.procedure = Broad-based-scale  10 1.0046 [0.9802; 1.0297] <0.0001 <0.0001
## diag.procedure = Symptoms           15 1.0168 [0.9360; 1.1046]  0.0131  0.1144
##                                        Q   I^2
## diag.procedure = Diagnosis         24.54 26.6%
## diag.procedure = Broad-based-scale  4.13  0.0%
## diag.procedure = Symptoms          41.43 66.2%
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_diag,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

S7. Official vs. probable school-entry cut-off

Code

res_mod <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        subgroup = Cut_off_date,
                        method.tau = "REML",
                        n.e = as.numeric(dat_main$N),
                        sm = "OR",
                        studlab = paste(dat_main$Study_name),
                        data = dat_main)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

Forest plot

meta::forest(res_mod,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

S8. Jackknife meta-analysis

repNA = rep(NA, length(unique(dat_prim$study_ID)))
res.JK = data.frame(es=repNA, ci_lo = repNA, ci_up = repNA, pval = repNA)
# i = 0
for (cohort in unique(dat_prim$study_ID)) {
  # i = i+1
  res = NA
  res = meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        sm = "OR",
                        data = subset(dat_prim, study_ID != cohort))
  i = which(unique(dat_prim$study_ID) == cohort)

  res.JK$es[i] = res$TE.random
  res.JK$ci_lo[i] = res$lower.random
  res.JK$ci_up[i] = res$upper.random
  res.JK$pval[i] = res$pval.random
}
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.